package design.patterns.creation;

/**
 * 工厂方法模式
 * 解释：
 * 工厂方法模式是一种创建型设计模式，
 * 其在父类中提供一个创建对象的方法， 允许子类决定实例化对象的类型。
 */

/**
 * 情景
 * 派出不同的交通工具，进行运输货物
 * 此处派出海上、陆地 的交通工具
 * 主要类：
 *      SeaRoad SeaRoadTransport
 *      LandRoad LandRoadTransport
 */
public class A_FactoryMethod {
    public static void main(String[] args) {
        String seaRoadType = "海路";
        String landRoadType = "陆地";

        String roadType = seaRoadType;

        TransportFactory.dispatchTransport(roadType);

    }
}
/**
 * 情景
 * 派出不同的交通工具，进行运输货物
 * 此处派出海上、陆地、空中 的交通工具
 * 主要类：
 *      SeaRoad SeaRoadTransport
 *      LandRoad LandRoadTransport
 *      AirRoad AirRoadTransport
 */
class A_FactoryMethod1 {
    public static void main(String[] args) {
        String seaRoadType = "海路";
        String landRoadType = "陆地";
        String airRoadType = "空中";

        String roadType = "海路";

        TransportFactory.dispatchTransport(roadType);

    }
}

/**
 * 运输功能接口
 *
 */
interface Transport{
    /**
     * 运输函数
     * 用于运输功能
     */
    void deliver();
}

/**
 * 运输工具的抽象类
 * 用于定义通用的方法
 */
abstract class AbstractTransport {
    /**
     * 计划 派出的运输方式
     */
    public void planDeliver(){
        createTransport().deliver();
    }

    /**
     * 指派运输方式
     * @return
     */
    abstract Transport createTransport();

}

/**
 * 海路船只类
 *  即派出的船只
 */
class SeaRoad implements Transport{

    @Override
    public void deliver() {
        System.out.println("派出船只走海路");
    }
}

/**
 * 海路运输类
 * 用于 海路运输 派出 船只
 */
class SeaRoadTransport extends AbstractTransport {

    @Override
    Transport createTransport() {
        return new SeaRoad();
    }
}

/**
 * 陆地汽车类
 *  即派出的汽车
 */
class LandRoad implements Transport{

    @Override
    public void deliver() {
        System.out.println("派出汽车走陆地");
    }
}

/**
 * 汽车运输类
 * 用于 陆地运输 派出 汽车
 */
class  LandRoadTransport extends AbstractTransport {

    @Override
    Transport createTransport() {
        return new LandRoad();
    }
}

/**
 * 飞机类
 *  即派出的飞机
 */
class AirRoad implements Transport{

    @Override
    public void deliver() {
        System.out.println("派出飞机飞空中");
    }
}
/**
 * 空中运输类
 * 用于 空中运输  派出 飞机
 */
class AirRoadTransport extends AbstractTransport {

    @Override
    Transport createTransport() {
        return new AirRoad();
    }
}

/**
 * 运输工厂类
 *  用于派出不同的运输工具
 */
class TransportFactory{
    static void dispatchTransport(String roadType){
        Transport transport;
        if (roadType.equals("陆地")){
            new LandRoadTransport().planDeliver();
        }
        else if (roadType.equals("海路")){
            new SeaRoadTransport().planDeliver();
        }else if(roadType.equals("空中")){
            new AirRoadTransport();
        }

    }

}